/**
 * 987. 最长湍流子数组
 */
public class Exerciser6 {
    public int maxTurbulenceSize(int[] arr) {
        // 这个的最终状态有两种，一种是下降状态，一种是上升状态。
        // f[i]: 到达i位置后结尾的所有子数组中，状态为 上升 时最大湍流子数组的长度。
        // g[i]: 到达i位置后结尾的所有子数组中，状态为 下降 时最大湍流子数组的长度。
        int n = arr.length;
        int[] f = new int[n];
        int[] g = new int[n];
        // 初始化：对于数组中的值，自身也是一个 湍流子数组，所以把 动态队列所有位置初始化为1
        for(int i = 0;i < n;i++) {
            f[i] = g[i] = 1;
        }
        // 当是自身一个的时候，也是一个长度
        int ret = 1;
        for(int i = 1;i < n;i++) {
            if(arr[i - 1] > arr[i]) {
                // 下降
                // 上一个位置就是上升
                g[i] = f[i - 1] + 1;
            }else if(arr[i - 1] < arr[i]) {
                // 上升
                // 上一个位置就是下降
                f[i] = g[i - 1] + 1;
            }
            ret = Math.max(ret,Math.max(f[i],g[i]));
        }
        return ret;
    }
}
